/*******************************************************************************
 * Copyright (c) 2008, 2009 Fabio Mauro - Alberto Terraneo.
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.2
 * or any later version published by the Free Software Foundation.
 *     
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied 
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 * See the GNU Free Documentation License for more details.
 *     
 * You should have received a copy of the GNU Free Documentation 
 * License along with this distribution; if not, send a email to authors:
 * aterraneo <at> users.sourceforge.net
 * bigmoby09 <at> users.sourceforge.net
 *******************************************************************************/
package it.blueocean.acanto.model;

import it.blueocean.acanto.model.common.ABaseEntity;
import it.blueocean.acanto.model.constants.StatoGruppo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.ForeignKey;
import org.hibernate.validator.Length;

@Entity
@Table(name = "TA_GRUPPI")
public class Gruppo extends ABaseEntity implements Serializable
{
    private static final long serialVersionUID = -7053120151871114017L;

    @Id
    @Column(name = "ID_GRUPPO", unique = true, nullable = false)
    private String id;

	@Column(name = "DESCRIZIONE", unique = true, length = 100)
	@Length(max = 100)
	private String descrizione;
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_REFERENTE_PRINCIPALE")
    @ForeignKey(name = "FK_GRUPPO_FAMIGLIA")
    private Famiglia referentePrincipale;
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_REFERENTE_SOSTITUTO")
    @ForeignKey(name = "FK_GRUPPO_FAMIGLIA")
    private Famiglia referenteSostituto;
    
    @Column(name = "NOTE", unique = true, length = 255)
    private String note;
    
    @Column(name = "STATUS", columnDefinition = "CHAR(30)")
    @Enumerated(EnumType.STRING)
    private StatoGruppo status = null;
    
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "gruppo")
    private Set<Famiglia> famiglieAssociate = new HashSet<Famiglia>(0);

    public Gruppo(){}
    
    @Override
    public boolean equals(Object obj)
    {
        if (obj instanceof Gruppo)
        {
            Gruppo gruppo = (Gruppo) obj;
            return 
            gruppo.getId().equalsIgnoreCase(this.getId()) && 
                gruppo.getDescrizione().equalsIgnoreCase(this.getDescrizione());
        }
        else
            return false;
    }
    
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = prime * ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((descrizione == null) ? 0 : descrizione.hashCode());
        return result;
    }
    
    @Override
    public String toString()
    {
        final String TAB = "    ";

        StringBuilder retValue = new StringBuilder();

        retValue.append("Gruppo ( ")
        .append(super.toString()).append(TAB)
        .append("id = ").append(this.getId()).append(TAB)
        .append("descrizione = ").append(this.getDescrizione()).append(TAB)
        .append("famiglieAssociate = ").append(this.getFamiglieAssociate()).append(TAB)
        .append("referentePrincipale = ").append(this.getReferentePrincipale()).append(TAB)
        .append("referenteSostituto = ").append(this.getReferenteSostituto()).append(TAB)
        .append(" )");

        return retValue.toString();
    }

	public String getId()
	{
		return id;
	}

	public void setId(String id)
	{
		this.id = id;
	}

	public String getDescrizione()
	{
		return descrizione;
	}

	public void setDescrizione(String descrizione)
	{
		this.descrizione = descrizione;
	}

	public Famiglia getReferentePrincipale()
	{
		return referentePrincipale;
	}

	public void setReferentePrincipale(Famiglia referentePrincipale)
	{
		this.referentePrincipale = referentePrincipale;
	}

	public Famiglia getReferenteSostituto()
	{
		return referenteSostituto;
	}

	public void setReferenteSostituto(Famiglia referenteSostituto)
	{
		this.referenteSostituto = referenteSostituto;
	}

	public String getNote()
	{
		return note;
	}

	public void setNote(String note)
	{
		this.note = note;
	}

	public StatoGruppo getStatus()
	{
		return status;
	}

	public void setStatus(StatoGruppo status)
	{
		this.status = status;
	}

	public Set<Famiglia> getFamiglieAssociate()
	{
		return famiglieAssociate;
	}

	public void setFamiglieAssociate(Set<Famiglia> famiglieAssociate)
	{
		this.famiglieAssociate = famiglieAssociate;
	}

}
